[libcxx] LWG2420 bits for bind<void> - Patch from K-Ballo Implemented LWG2420 bits for bind<void> Review: http://reviews.llvm.org/D10997 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@241967 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/__functional_03 b/include/__functional_03 index 9935483..13c38d8 100644 --- a/include/__functional_03 +++ b/include/__functional_03 
@@ -2091,14 +2091,16 @@  result_type  operator()(_Args&& ...__args)  { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);  }    template <class ..._Args>  result_type  operator()(_Args&& ...__args) const  { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);  }  };   
diff --git a/include/functional b/include/functional index 7a9d68d..90972bc 100644 --- a/include/functional +++ b/include/functional 
@@ -2186,12 +2186,13 @@  typename enable_if  <  is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type, - result_type>::value, + result_type>::value || is_void<_Rp>::value,  result_type  >::type  operator()(_Args&& ...__args)  { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);  }    template <class ..._Args> @@ -2199,12 +2200,13 @@  typename enable_if  <  is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type, - result_type>::value, + result_type>::value || is_void<_Rp>::value,  result_type  >::type  operator()(_Args&& ...__args) const  { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);  }  };   
diff --git a/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp b/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp index 03447db..b7874b7 100644 --- a/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp +++ b/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp 
@@ -39,21 +39,34 @@    void f() {++count;}   -struct A_int_0 +int g() {++count; return 0;} + +struct A_void_0  {  void operator()() {++count;}  void operator()() const {count += 2;}  };   +struct A_int_0 +{ + int operator()() {++count; return 4;} + int operator()() const {count += 2; return 5;} +}; +  int main()  {  test(std::bind(f));  test(std::bind(&f)); - test(std::bind(A_int_0())); - test_const(std::bind(A_int_0())); + test(std::bind(A_void_0())); + test_const(std::bind(A_void_0()));    test(std::bind<void>(f));  test(std::bind<void>(&f)); + test(std::bind<void>(A_void_0())); + test_const(std::bind<void>(A_void_0())); + + test(std::bind<void>(g)); + test(std::bind<void>(&g));  test(std::bind<void>(A_int_0()));  test_const(std::bind<void>(A_int_0()));  }